package com.leetcode.www;

/**
 * Creared with IntelliJ IDEA.
 * Description:给定一个 row x col 的二维网格地图 grid ，其中：grid[i][j] = 1 表示陆地， grid[i][j] = 0 表示水域。
 *
 * 网格中的格子 水平和垂直 方向相连（对角线方向不相连）。整个网格被水完全包围，但其中恰好有一个岛屿（或者说，一个或多个表示陆地的格子相连组成的岛屿）。
 *
 * 岛屿中没有“湖”（“湖” 指水域在岛屿内部且不和岛屿周围的水相连）。格子是边长为 1 的正方形。网格为长方形，且宽度和高度均不超过 100 。计算这个岛屿的周长。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/island-perimeter
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * User:yxd
 * Date:2022-03-14
 * Time:17:33
 */
public class DFS463 {
    public int[][] a = {{0,1},{0,-1},{1,0},{-1,0}};
    public int islandPerimeter(int[][] grid) {
        if(grid == null)return 0;
        int row = grid.length;
        int col = grid[0].length;
        int count = 0;
        for(int i = 0;i < row;i ++){
            for(int j = 0;j < col;j ++){
                if(grid[i][j] == 1){
                    count += DFS(grid,row,col,i,j);
                }
            }
        }
        return count;
    }
    public int DFS(int[][] grid,int row,int col,int curX,int curY){
        //当前应该干什么
        //判断当前边是否是水域和陆地的交汇处
        if(curX >= row || curX < 0 || curY >= col || curY < 0 || grid[curX][curY] == 0){//处理边界条件
            return 1;
        }
        if(grid[curX][curY] == 2){
            return 0;
        }
        grid[curX][curY] = 2;//表示这块陆地已经统计过了无需再次统计
        int sum = 0;
        //下一步应该做什么
        for(int i = 0;i < 4;i ++){
            int newX = curX + a[i][0];
            int newY = curY + a[i][1];
            sum += DFS(grid,row,col,newX,newY);
        }
        return sum;

    }
}
